<?php
/* 
 title: Miniaturas
 
 class: thumbnail
 Esta classe gera diversos tipos de mini-Images
  
 notes:
 
 Autor: Marcos José Setim
 Versão: 1.2.2
 Criada em: 19 Jan 2004
 
 
 <section>Changelog</section>
 
 ChangeLog:
 
 <Topic>1.2 - 13 Julho 2005</Topic>
    
    - GIF Support -> Adicionado suporte a Images GIF
    
 <Topic>1.2.2 - 26 Agosto 2005</Topic>
    
    - BugFix -> Verifica se a Image pode ser criada, se não foi possível retorna 3
     
*/
class thumbnail
{
/*
  vars: access private
 
  string:
   $sPathThumb - Caminho onde a foto será salva
   $sPathImage - Caminho para foto original
   $sPathMain - Caminho onde o site está instalado
   
  vars: access protected
  
  vars: access public
*/
private $sPathThumb;
private $sPathSave;
private $sPathImage;
private $sPathMain;
   
  function __construct()
  {
  $this->pathMain = PATH_UPLOAD;
  }
  
  /*
    function: setNamePhoto
    Guarda o caminho para miniatura
    
    parameters:
      
      string: 
      $name - Name da Foto
  */
  function setThumb($sPath)
  {
      if (isset($this->pathMain))
      {
        $this->pathThumb = $sPath;
      }
      else
      {
        self::debug("Path which the site is installed. "," You need to inform the physical path which the site is installed, use the method: setPathMain(caminho)  ", __LINE__, __FILE__);
      }
  }

  /*
    function: setPathImage
    Guarda o caminho para foto original 
    
    parameters:
      
      string: 
      $sPath - Caminho para foto original
  */  
  public function setImage($sPath)
  {
     if (file_exists($this->pathMain.$sPath))
     {
        $this->pathImage = $sPath;
     }
     else
     {
        self::debug("Not found. "," Image could not be found. Path: ".$this->pathMain.$sPath, __LINE__, __FILE__);
     }
  }
  
    /*
     function: setPathMain
     Local onde o site está instalado
     
     parameters:
     
        string: 
        
        $sPath - Caminho Físico completo onde o site está (Path for the site)
    */
    public function setPathMain($sPath)
    {    
	    $this->pathMain = $sPath;
	    }
	    
	    
   /*
    function: makeThumb
    Cria a miniatura com altura e larguras determinados (Make the images with determined width and height)
      
    string:
      
      $typeThumb - Define o tipo de de Image gerada (Accountin the option of image)
       
    integer:
      
    $nwidth - new Largura (New width)
    $neight - new Altura (New height)

    returns:
      
    string:
       
    Caminho virtual para Image criada (Path of image created)
    
    integer:
    
     1 - Image não pode ser criada pois a altura ou largura da Image original é 0
     2 - Imagenão é JPG ou PNG
     3 - Image não pode ser criada
     
     notes:
     
     Tipos de Images Suportados:
     
     cut - Corta um pedaco aleatório da Image
     resizewscale - Faz um redimensionamento com scala, calculando a proporção da miniatura.
     resizenoscale - Faz um redimensionamento sem escala, o tamanho da miniatura será setado pelas variáveis $nheight e $nwidth
     resizesquare - Faz um redimensionamento tornando a Image quadrada
     resizecine - Faz um redimensionamento colocando a image no estilo cinema
  */
  public function makeThumb($nheight, $nwidth, $typeThumb)
  {
      if (!empty($this->pathImage))
      {
      	$Image = $this->pathMain.$this->pathImage;
      }
      else
      {
      	self::debug("Original Image Dir not. "," You need to inform the way for original image, use the method: setImage(/fotos/foto1.jpg) ", __LINE__, __FILE__);
      }
      
      if (!empty($this->pathThumb))
      {
      $img2name= $this->pathMain.$this->pathThumb;
      }
      else
      {
      self::debug("Path setado not. "," You need to inform the path where the image is saved, use the method: setThumb(/fotos/thumm/foto1.jpg) ", __LINE__, __FILE__);
      }
    
  list($width, $height, $type, $atributes) = @getimagesize($Image); //Dates of image
  // Added by Quang to solve out memory eceed problem
	$imageInfo = getimagesize($Image);
	$memoryNeeded = round(($imageInfo[0] * $imageInfo[1] * $imageInfo['bits'] * $imageInfo['channels'] / 8 + Pow(2, 16)) * 1.65);
	
	if (function_exists('memory_get_usage') && memory_get_usage() + $memoryNeeded > (integer) ini_get('memory_limit') * pow(1024, 2)) {
	
	   ini_set('memory_limit', (integer) ini_get('memory_limit') + ceil(((memory_get_usage() + $memoryNeeded) - (integer) ini_get('memory_limit') * pow(1024, 2)) / pow(1024, 2)) . 'M');
	
	}

  	
      // Cria uma Image GIF, PNG ou JPG de acordo com a Image original (Create one image GIF, jpg or png)
      if ($type==1) $img1 = @ImageCreateFromGIF($Image); 
      
      if ($type==2) $img1 = @ImageCreateFromJPEG($Image); 
      ////////// step1
      if ($type==3) $img1 = @ImageCreateFromPNG($Image) ;
     
             #=============== Verifica se a Image pode ser criada ===============#
             if (!$img1)
                return 3;
                  
      // Debug
      if ($width==0 || $height==0) return 1; // Not accept 0 $width ou $height 
      if (!$type== 2 && $type==3) return 2; // Type of image not accept    
  
  $scale = min($nwidth/$width, $nheight/$height);  // Get the scale of image

     switch ($typeThumb)
     {
         case "cut":    
         $img2 = ImageCreateTrueColor($nwidth, $nheight);
         $swidth = 0;
         $sheight = 0;

         // The width/height of img2 must be bigger that of the new image ($img2)
             if ($width >= $nwidth && $height >= $nheight)
             {
                 if ($scale<0.7)
                 {
                     if (($width/$nwidth) > 1.20 && ($height/$nheight) > 1.20)
                     {
                     $swidth = ceil(($width/$nwidth)*rand(10,($nwidth/3)));
                     $sheight = ceil(($height/$nheight)*rand(10,($nheight/3)));
                     }
                 }                     
             imagecopy($img2, $img1, 0, 0, $swidth, $sheight, imagesx($img2), imagesy($img2));
             
             }
             else
             {
             return 3; // Image não pode ser criada
             }                 
         break;
        
         case "resizewscale":
         
             if ($scale < 1) {
             $new_width = floor($scale*$width);
             $new_height = floor($scale*$height); 
            
             $img2 = ImageCreateTrueColor($new_width, $new_height);
          
             imagecopyresampled($img2, $img1, 0, 0, 0, 0,$new_width, $new_height, $width, $height);                         
             }
             else
             {
             return 3; // Image não pode ser criada
             }         
                
         break;
        
        case 'resizenoscale':
        $img2 = ImageCreateTrueColor($nwidth, $nheight);    
        imagecopyresampled($img2, $img1, 0, 0, 0, 0,$nwidth, $nheight, $width, $height);                         
        break;
            
        case 'resizesquare':
        $tmin = min($width, $height);
        $tnwidth=$tmin;
        $tnheight=$tmin;
                
           if ($width==0 || $height==0) break;
              $scale = min($tnwidth/$width, $tnheight/$height); 
                    
           $swidth = 0;
           $sheight = 0;
           # Verificar (bug) ($width>$height && $scale < 0.8) ? $swidth = ceil(($width/2)/2) : '';
           # Verificar (bug) ($width<$height && $scale < 0.8) ? $sheight = ceil(($height/2)/2) : '';
            
           if ($scale < 0.8)
           {
           return 3; // Image não pode ser criada
           }
         $img3= ImageCreateTrueColor($tnwidth, $tnheight);
    
         imagecopy($img3, $img1, 0, 0, $swidth, $sheight, $tnwidth, $tnheight);
                
         $img2 = ImageCreateTrueColor($nwidth, $nheight);
            
         imagecopyresampled($img2, $img3, 0, 0, 0, 0,$nwidth, $nheight, $tnwidth, $tnheight); 
          
         break;

         case 'resizecine':
             
             if ($scale < 1) {
                
             $scale = min($nwidth/$width, $nheight/$height); 
           
             $new_width = floor($scale*$width);
             $new_height = floor($scale*$height); 
                  
             $img2 = ImageCreateTrueColor($nwidth, $nheight);
             
             $background = imagecolorallocate($img2, 255, 255, 255); // Background White
             ImageFilledRectangle($img2, 0, 0, $nwidth, $nheight, $background); // Desenha um retângulo do tamanho da miniatura com fundo branco
             
             $swidth = ceil(($nwidth-$new_width)/2);
             $sheight = ceil(($nheight-$new_height)/2);
                          
             imagecopyresampled($img2, $img1, $swidth, $sheight, 0, 0,$new_width, $new_height, $width, $height);                         
             }
             else
             {
             return 3;  // Image não pode ser criada
             }
        break;
    }            
    
        // Save image in accordance with your type
        if ($type==1) {imageGIF($img2, $img2name);}
        if ($type==2) {imageJPEG($img2, $img2name);}
        if ($type==3) {imagePNG($img2, $img2name);}
        
    // Destroy temporary images
    @ImageDestroy($img1);
    @ImageDestroy($img2);
    @ImageDestroy($img3);

    // Remove o path do servidor do path da image (replace remove the path of server of path image)
    return str_replace($this->pathMain,'',$img2name);
    }
    
    /*
     function: debug
     Debug Function
     
     parameters:
     
     string: 
     
         $message - Contém a Message para debug (Accountin the message for debug)
         $param - Informações extras (Accountin some extra information)
         $FILE - Name do archive (Accountin the name of file)
         $LINE - Line do archive (Accountin the line of file)
    */
    private function debug($message, $param = 'Sem parâmetros', $FILE = '', $LINE = '')
    {
        if ( DEBUG ) //@see header
        {
        $out = "
        <h2>!Debug!</h2><br />
        <font color=\"red\">$message</font><br />
        <strong>Aviso</strong>: $param <br /><br />
        <strong>archive:</strong> $FILE : <br /><strong>Line:</strong> $LINE
        ";
        
        die($out);
        }
        else
        {
        Header ('Location: /index.php'); // Stop the execution without message and redir for index (Para a execução sem Messages e redireciona para index)
        }
    }
}
/*
section: Exemplo de uso (Example of use)

topic: Criando Images
Criando 5 Images

include ("mainapi/inc/class.thumbnail.inc.php");

$thumb = new thumbnail;

$thumb->setPathMain(/home/meusite/public_html);

$thumb->setImage('bush_baby.jpg');

$thumb->setThumb('tmp/teste/cut.jpg');

$cut = $thumb->makeThumb(100, 100, 'cut');

$thumb->setThumb('tmp/teste/resizenoscale.jpg');

$thumb->makeThumb(100, 100, 'resizenoscale');

$thumb->setThumb('tmp/teste/resizecine.jpg');

$resizecine =  $thumb->makeThumb(100, 100, 'resizecine');

$thumb->setThumb('tmp/teste/resizewscale.jpg');

$thumb->makeThumb(100, 100, 'resizewscale');

$resizesquare = $thumb->setThumb('tmp/teste/resizesquare.jpg');

$thumb->makeThumb(100, 100, 'resizesquare');
*/
?>